home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / Ebooks / Thinking in C++ V2 / C25 / Observable.h < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-25  |  1.2 KB  |  44 lines

  1. //: C25:Observable.h
  2. // From Thinking in C++, 2nd Edition
  3. // Available at http://www.BruceEckel.com
  4. // (c) Bruce Eckel 1999
  5. // Copyright notice in Copyright.txt
  6. // The Observable class
  7. #ifndef OBSERVABLE_H
  8. #define OBSERVABLE_H
  9. #include "Observer.h"
  10. #include <set>
  11.  
  12. class Observable {
  13.   bool changed;
  14.   std::set<Observer*> observers;
  15. protected:
  16.   virtual void setChanged() { changed = true; }
  17.   virtual void clearChanged(){ changed = false; }
  18. public:
  19.   virtual void addObserver(Observer& o) {
  20.     observers.insert(&o);
  21.   }
  22.   virtual void deleteObserver(Observer& o) {
  23.     observers.erase(&o);
  24.   }
  25.   virtual void deleteObservers() {
  26.     observers.clear();
  27.   }
  28.   virtual int countObservers() {
  29.     return observers.size();
  30.   }
  31.   virtual bool hasChanged() { return changed; }
  32.   // If this object has changed, notify all
  33.   // of its observers:
  34.   virtual void notifyObservers(Argument* arg=0) {
  35.     if(!hasChanged()) return;
  36.     clearChanged(); // Not "changed" anymore
  37.     std::set<Observer*>::iterator it;
  38.     for(it = observers.begin(); 
  39.       it != observers.end(); it++)
  40.       (*it)->update(this, arg);
  41.   }
  42. };
  43. #endif // OBSERVABLE_H ///:~
  44.